import ENV_CONFIG from '@/env.js'
const options = {
	// 是否显示加载模态框
	loading: false,
	loading_text: '加载中...',
	loading_mask: false,
	// 是否需要完整返回信息 data
	catch: false,
	// 成功提示，默认不提示
	toast: false,
	// 显示失败消息 默认显示
	showError: true,
	errorText: '服务器开小差啦,请稍后再试~',
	_401: true, // 是否需要401跳转
	_401_url: '/pages/login/login', // 401跳转地址
	_500ErrorText:'服务器错误,请联系管理员'
}
module.exports = (vm) => {
	// 初始化请求配置
	uni.$u.http.setConfig((config) => {
		/* config 为默认全局配置*/
		config.baseURL = ENV_CONFIG.env.BASE_URL; /* 根域名 */
		config.custom = options;
		return config
	})
	// 请求拦截
	uni.$u.http.interceptors.request.use((config) => { // 可使用async await 做异步操作
		// 初始化请求拦截器时，会执行此方法，此时data为undefined，赋予默认{}
		config.data = config.data || {}
		const custom = config.custom
		// console.log(config,3);
		if (custom.loading) {
			uni.showLoading({
				title: custom.loading_text,
				mask: custom.loading_mask,
				fail: () => {
					uni.hideLoading();
				},
			})
		}
		// 根据custom参数中配置的是否需要token，添加对应的请求头
		// if(custom.auth) {
		config.header.token = vm.$getToken() || ''
		// }
		if (custom.isformdata) {
			config.header['content-type'] = 'application/x-www-form-urlencoded'
		}
		return config
	}, config => { // 可使用async await 做异步操作
		return Promise.reject(config)
	})

	// 响应拦截
	uni.$u.http.interceptors.response.use((response) => {
		/* 对响应成功做点什么 可使用async await 做异步操作*/
		const data = response.data
		// 自定义参数
		const custom = response.config?.custom
		if (custom.loading) {
			uni.hideLoading()
		}
		if (data.code !== 1) {
			// 如果没有显式定义custom的toast参数为false的话，默认对报错进行toast弹出提示
			if (custom.showError) {
				uni.$u.toast(data.msg || custom.errorText)
			}
			// 如果需要catch返回，则进行reject
			if (custom?.catch) {
				return data
			} else {
				// 否则返回一个pending中的promise，请求不会进入catch中
				return new Promise(() => {})
			}
		} else {
			if (custom.toast) {
				uni.$u.toast(data.msg)
			}
		}
		return data.data === undefined ? {} : (custom?.catch ? data : data.data)
	}, (response) => {
		// 对响应错误做点什么 （statusCode !== 200）
		const custom = response.config?.custom
		if (custom.loading) {
			uni.hideLoading()
		}
		const data = response.data
		if (response.statusCode === 401) {
			vm.$store.commit('user/$setStore', {
				path: 'userInfo',
				value: {}
			})
			uni.clearStorageSync()
			if (custom._401) {
				uni.$u.toast(data.msg || custom.errorText)
				setTimeout(() => {
					uni.navigateTo({
						url: custom._401_url
					})
				}, 1000)
			} else {
				return {token: ''}
			}
		} else if (response.statusCode === 500) {
			uni.$u.toast(custom._500ErrorText)
		}
		return Promise.reject(response)
	})
}